This is a quick view of the education expenditure across the globe.
We try to see where we seat between some ambitious goals of the SDG 4
we’ve planned to achieve in 2030 and where we were in 2015.
Loading data
| Aruba |
1.a |
1.a.2 |
Expenditure on education as a percentage of total
government expenditure (%) |
2015 |
23.20 |
ABW |
Latin America & Caribbean |
High income |
| Aruba |
4.5 |
4.5.6 |
Initial government expenditure on education as a
percentage of GDP (%) |
2014 |
5.78 |
ABW |
Latin America & Caribbean |
High income |
| Aruba |
4.5 |
4.5.6 |
International expenditure on education as a percentage
of GDP (%) |
2013 |
2.63 |
ABW |
Latin America & Caribbean |
High income |
| Aruba |
4.5 |
4.5.6 |
International expenditure on education as a percentage
of GDP (%) |
2016 |
2.19 |
ABW |
Latin America & Caribbean |
High income |
| Aruba |
4.2 |
4.2.4 |
Net enrolment rate, pre-primary, female (%) |
2013 |
98.89 |
ABW |
Latin America & Caribbean |
High income |
| Aruba |
4.5 |
4.5.6 |
International expenditure on education as a percentage
of GDP (%) |
2014 |
2.00 |
ABW |
Latin America & Caribbean |
High income |
Analysis of the
expenditure on education as a percentage of total government expenditure
(%)
The graph above shows the median value trends of the
expenditure on education as a percentage of total government
expenditure (%) for different regions from 2015 to 2022. The
trend has been an overall fall down. The cross-regional expenditure on
education as a percentage of total government (%) has diminished by
3.5% points between 2016 and 2022 showing that
priorities are being given to others sector at the spend of the
education one. The decline has been most pronounced in East Asia
& Pacific and Middle East & North
Africa. Only the Europe & Central Asia has
experienced a slight increase of its expenditure on education as a
percentage of total government (0.85%).
Here are some meaningful insights that can be gleaned from this graph:
- The decline in expenditure on education as a percentage of total government expenditure is a worrying trend, as it suggests that governments are prioritizing other sectors over education. This could have negative consequences for the long-term development of these countries, as education is essential for economic growth and social progress.
- The COVID-19 pandemic may have had an impact on the decline in expenditure on education, as governments have been forced to spend more on healthcare and other essential services. However, it is also possible that the decline was due to other factors, such as austerity measures or a lack of political commitment to education.
- The fact that only **Europe & Central Asia** experienced an increase in expenditure on education as a percentage of total government expenditure suggests that this region is more committed to education than other regions. This could be due to a number of factors, such as a strong cultural emphasis on education or a belief that education is essential for economic competitiveness.
It is important to note that this graph only shows the median values for each region. This means that there is a lot of variation within each region. For example, some countries may have increased their expenditure on education as a percentage of total government expenditure, even though the median value for their region has declined.
Overall, this graph is a worrying sign that education is being neglected by many governments. It is important to remember that education is an essential investment for the future, and governments should be doing more to support it.
The line graph above shows the median value trends of the
expenditure on education as a percentage of total government expenditure
(%) for different Income groups from 2015 to 2022.
- The cross-regional expenditure on education as a percentage of total
government (%) has declined by 2.1 percentage points
between 2016 and 2022. This suggests that education is being given a
lower priority than other sectors, such as health or infrastructure
etc.
- The decline in education spending has been most pronounced in Lower
middle income countries. This could be due to a number of factors, such
as these countries have been disproportionately affected by the COVID-19
pandemic or having weaker economic growth.
- The decline in education spending is more pronounced after 2018.
This suggests that the COVID-19 pandemic might has had a significant
impact on education spending.
- The expenditure on education as a percentage of total government
expenditure (%) is an indicator of the SDGs 4 to appreciate the priority
given by countries to education. The decline in education spending
suggests that countries are not giving education the priority it
deserves.
Here are some of the important figures from the graph:
- The cross-regional median expenditure on education as a percentage of total government expenditure (%) in 2015 was 15.9%.
- The cross-regional median expenditure on education as a percentage of total government expenditure (%) in 2022 was 13.8%.
- The largest decline in education spending was in Lower middle income countries, where the median expenditure fell from 16.3% in 2016 to 13.1% in 2022.
Overall, the graph shows that education spending is declining as a percentage of total government expenditure. This is a worrying trend, as education is essential for economic development and poverty reduction. The COVID-19 pandemic has exacerbated this trend, and it is important that countries take steps to increase education spending in order to meet the SDGs 4.
Here are some additional thoughts on the graph:
- It is important to note that the graph only shows median values. This means that there is a lot of variation in education spending between countries within each income group.
- The graph does not show the reasons for the decline in education spending. More research is needed to understand why education spending is declining and what can be done to reverse this trend.
Analysis of
Government expenditure on education as a percentage of GDP (%)
The line graph above shows the median value trends of the
government expenditure on education as percentage of GDP for different
region from 2015 to 2022.
- Overall downward trend: The cross-regional median
value decreased from 4.6% in 2015 to 3.2% in 2022. This means that
government spending on education as a percentage of GDP has declined
globally.
- Regional variations: The decline has been most
pronounced in North America and the Middle East & North Africa, with
decreases of 1.7% and 1.6% points, respectively. Europe & Central
Asia is the only region that has seen a slight increase (0.4%
points).
- Education 2030 FFA target: In 2022, all regions
except Europe & Central Asia fell below the 4% Education 2030 FFA
target for government expenditure on education as a percentage of GDP.
The cross-regional median value was 3.2%, which is significantly below
the target.
- Possible impact of COVID-19: The downward trend
began in 2016 and became more pronounced after 2019. This suggests that
the COVID-19 pandemic may have had a significant impact on government
spending on education.
- Sub-Saharan Africa: This region has consistently
fallen below the 4% Education 2030 FFA target, despite a slight increase
between 2015 and 2020.
- South Asia: This region reached the 4% target in
2020 after a significant upward trend, but has since fallen back below
the target in 2021 and 2022, with a particularly sharp decline in
2022.
Here are some additional important figures to note:
* The median government expenditure on education as a percentage of GDP in 2022 was 3.2%.
* The Education 2030 FFA target is 4%.
* The largest decline in government expenditure on education as a percentage of GDP was in North America (1.7% points).
* The only region to increase its government expenditure on education as a percentage of GDP was Europe & Central Asia (0.4% points).
Overall, the graph shows a concerning trend of declining government spending on education across most regions. The COVID-19 pandemic may have played a role in this decline, but further research is needed to determine the full extent of its impact.
The line graph above shows the median value trends of the
government expenditure on education as percentage of GDP for different
Income groups from 2015 to 2022.
Overall downward trend:
- The median government expenditure on education as a percentage of
GDP has declined from 4.4% in 2015 to 3.6% in 2022. This means that
education is getting a smaller share of government budgets across the
globe.
- This decline is particularly concerning because education is crucial
for economic development, poverty reduction, and social progress.
Regional variations:
- The decline has been most pronounced in high-income countries, with
a decrease of 1.1 percentage points since 2015. This is surprising, as
these countries tend to have more resources available for
education.
- Upper-middle-income countries are the only ones that still meet the
Education 2030 FFA target of 4% spending on education.
- Low-income countries have consistently fallen below the target,
despite a small increase between 2015 and 2021. However, their spending
has also fallen back below 2015 levels since 2022.
Possible impact of COVID-19:
- The downward trend in education spending began in 2016 and became
more pronounced after 2019. This coincides with the COVID-19 pandemic,
suggesting that it may have played a significant role in the
decline.
- Governments may have been forced to cut education spending to deal
with the economic and health challenges of the pandemic.
Important figures:
- The median government expenditure on education as a percentage of
GDP in 2022 was 3.6%.
- The Education 2030 FFA target is 4%.
- The largest decline in government expenditure on education as a
percentage of GDP was in high-income countries (1.1 percentage
points).
Call to action:
This downward trend in education spending is alarming and needs to be
reversed. Governments should prioritize education spending and ensure
that it meets the Education 2030 FFA target provided we are almost in
half way. This will require investing more resources in education, even
in the face of other challenges. Investing in education is not just an
expense; it is an investment in the future.
Analysis of the
out-of-school rate for children of primary school age, both sexes
(%)
The line graph above shows the median value trends of the
Out-of-school rate for children of primary school age, both sexes for
different region from 2015 to 2022.
Here are some of the key insights we can glean from this data:
- Overall increase in out-of-school children: The
cross-regional median value increased from 2.6% in 2015 to 4.4% in 2022,
exceeding the Education 2030 FFA target of 0%. This means that on
average, more children are out of school now than in 2015.
- Disparities between regions: The increase has been
most pronounced in Sub-Saharan Africa, where the median value increased
by 3.1 percentage points between 2015 and 2022. The gap between the
target and Sub-Saharan Africa’s value in 2021 is a significant 18.4
percentage points.
- The Sub-Saharan African, South Asia and Latin America &
Caribbean regions have consistently evolded overhead the cross-regional
median value. This suggests that these regions are not making progress
towards achieving universal primary education.
- Potential causes: The COVID-19 pandemic may have
played a role in this increase, as many schools were closed during the
pandemic. However, other factors, such as poverty or conflict, may also
have contributed.
- Importance of education: Education is essential for
economic development and poverty reduction. The increasing out-of-school
rate is a worrying trend that could have negative consequences for these
regions in the long term.
Here are some additional thoughts on the data:
- The graph only shows the median values for each region. It would be
interesting to see the full range of data for each region to get a
better sense of the variability within each region.
- The graph does not provide any information on the reasons why
children are out of school. It would be helpful to have more data on
this to better understand the problem and develop effective
interventions.
- Despite the overall increase, there may be some regions or countries
that are making progress in reducing their out-of-school rates. It is
important to identify and share best practices from these success
stories.
Overall, the line graph highlights a serious problem that needs to be
addressed. More research is needed to understand the causes of the
increase in out-of-school children, and effective interventions are
needed to get more children back into school.
The line graph above shows the median value trends of the
out-of-school rate for children of primary school age for different
Income groups from 2015 to 2022.
Here are some of the key insights we can glean from this data:
- Overall increase in out-of-school children: The
median value increased from 4.8% in 2015 to 5.5% in 2022, exceeding the
Education 2030 FFA target of 0%. This means that on average, more
children are out of school now than in 2015.
- Disparities between income groups: The increase has
been most pronounced in low-income countries, where the median value
increased by 3.1 percentage points between 2015 and 2022. The gap
between the target and low income countries’ value in 2021 is a
significant 24.8 percentage points.
- Potential causes: The COVID-19 pandemic may have
played a role in this increase, as many schools were closed during the
pandemic. However, other factors, such as poverty or conflict, may also
have contributed.
- Importance of education: Education is essential for
economic development and poverty reduction. The increasing out-of-school
rate is a worrying trend that could have negative consequences for these
regions in the long term.
Here are some additional thoughts on the data:
- The graph only shows the median values for each region. It would be
interesting to see the full range of data for each region to get a
better sense of the variability within each region.
- The graph does not provide any information on the reasons why
children are out of school. It would be helpful to have more data on
this to better understand the problem and develop effective
interventions.
- Despite the overall increase, there may be some regions or countries
that are making progress in reducing their out-of-school rates. It is
important to identify and share best practices from these success
stories.
Overall, the line graph highlights a serious problem that needs to be
addressed. More research is needed to understand the causes of the
increase in out-of-school children, and effective interventions are
needed to get more children back into school.
Analysis of the
Completion rate, primary education, both sexes (%)
Analysis of the Net
enrolment rate, early childhood education, both sexes (%)
Analysis of the Net
enrolment rate, pre-primary, both sexes (%)
LS0tDQp0aXRsZTogIkVkdWNhdGlvbiBFeHBlbmRpdHVyZSBBbmFseXNpcyINCkF1dGhvcjogQU1SIElOVEVSTkFUSU9OQUwNCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGtlZXBfbWQ6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGNzczogc3R5bGUuY3NzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBvZmZpY2Vkb3duOjpyZG9jeF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQpUaGlzIGlzIGEgcXVpY2sgdmlldyBvZiB0aGUgZWR1Y2F0aW9uIGV4cGVuZGl0dXJlIGFjcm9zcyB0aGUgZ2xvYmUuIFdlIHRyeSB0byBzZWUgd2hlcmUgd2Ugc2VhdCBiZXR3ZWVuIHNvbWUgYW1iaXRpb3VzIGdvYWxzIG9mIHRoZSBTREcgNCB3ZSd2ZSBwbGFubmVkIHRvIGFjaGlldmUgaW4gMjAzMCBhbmQgd2hlcmUgd2Ugd2VyZSBpbiAyMDE1Lg0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQpkZjEgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJkYXRhL1NER19TZXB0MjAyM19sb25nLnhsc3giKQ0KZGYxIDwtIGRmMSB8Pg0KICAjbXV0YXRlKFllYXIgPSBhc19kYXRlKFllYXIpKSB8Pg0KICBhc190aWJibGUoKQ0KZGYyIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiZGF0YS9lY29ub215LWNsYXNzLnhsc3giKQ0KZGYyIDwtIGRmMiB8Pg0KICBhc190aWJibGUoKQ0KDQpkZiA8LSBpbm5lcl9qb2luKGRmMSwgZGYyLCBieSA9ICJDb3VudHJ5IikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGRmLCAiZGF0YS90aWR5L2VkdWV4cF9kZi54bHN4IikNCmRmIHw+DQogIGhlYWQoKSB8Pg0KICBrbml0cjo6a2FibGUoKQ0KYGBgDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplZHVjZXhwX2RmIDwtIGRmIHw+DQogIGZpbHRlcigNCiAgICBZZWFyICVpbiUgc2VxKDIwMTUsIDIwMjIpLA0KICAgIGBJbmRpY2F0b3IgTmFtZWAgPT0gIkV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkiDQogICkgDQpvcGVueGxzeDo6d3JpdGUueGxzeChlZHVjZXhwX2RmLCAiZGF0YS90aWR5L2VkdWNleHBfZGYueGxzeCIpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCnJlZ2VkdWNleHBfZGYgPC0gZWR1Y2V4cF9kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSAjfD4NCiAgIyBtdXRhdGUodGFyZ2V0ID0gNCkNCiN2aWV3KHJlZ2VkdWNleHBfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChyZWdlZHVjZXhwX2RmLCAiZGF0YS90aWR5L3JlZ2VkdWNleHBfZGYueGxzeCIpDQojZ2xpbXBzZShyZWdlZHVjZXhwX2RmKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpyZWdtZWRpYW4gPC0gcmVnZWR1Y2V4cF9kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NyZWdtZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAxOioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDYsIG91dC53aWR0aD0gIjEwMCUifQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICByZWdlZHVjZXhwX2RmLA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gcmVnaW9uLA0KICAgICAgIyBsaW5ldHlwZSA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOSkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkb2RnZXJibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjMiLCAiZGFya2JsdWUiLCAiZGFya2dyZWVuIiwgICJwaW5rMSINCiAgICAgICkNCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIg0KICAgICkNCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQpUaGUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlICoqZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlICglKSoqIGZvciBkaWZmZXJlbnQgcmVnaW9ucyBmcm9tIDIwMTUgdG8gMjAyMi4gVGhlIHRyZW5kIGhhcyBiZWVuIGFuIG92ZXJhbGwgZmFsbCBkb3duLiBUaGUgY3Jvc3MtcmVnaW9uYWwgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50ICglKSBoYXMgZGltaW5pc2hlZCBieSAqKjMuNSUqKiBwb2ludHMgYmV0d2VlbiAyMDE2IGFuZCAyMDIyIHNob3dpbmcgdGhhdCBwcmlvcml0aWVzIGFyZSBiZWluZyBnaXZlbiB0byBvdGhlcnMgc2VjdG9yIGF0IHRoZSBzcGVuZCBvZiB0aGUgZWR1Y2F0aW9uIG9uZS4gVGhlIGRlY2xpbmUgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluICoqRWFzdCBBc2lhICYgUGFjaWZpYyoqIGFuZCAqKk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhKiouIE9ubHkgdGhlICoqRXVyb3BlICYgQ2VudHJhbCBBc2lhKiogaGFzIGV4cGVyaWVuY2VkIGEgc2xpZ2h0IGluY3JlYXNlIG9mIGl0cyBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgKiooMC44NSUpKiouDQoNCmBgYCAgICAgICAgIA0KSGVyZSBhcmUgc29tZSBtZWFuaW5nZnVsIGluc2lnaHRzIHRoYXQgY2FuIGJlIGdsZWFuZWQgZnJvbSB0aGlzIGdyYXBoOg0KDQotICAgVGhlIGRlY2xpbmUgaW4gZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIGlzIGEgd29ycnlpbmcgdHJlbmQsIGFzIGl0IHN1Z2dlc3RzIHRoYXQgZ292ZXJubWVudHMgYXJlIHByaW9yaXRpemluZyBvdGhlciBzZWN0b3JzIG92ZXIgZWR1Y2F0aW9uLiBUaGlzIGNvdWxkIGhhdmUgbmVnYXRpdmUgY29uc2VxdWVuY2VzIGZvciB0aGUgbG9uZy10ZXJtIGRldmVsb3BtZW50IG9mIHRoZXNlIGNvdW50cmllcywgYXMgZWR1Y2F0aW9uIGlzIGVzc2VudGlhbCBmb3IgZWNvbm9taWMgZ3Jvd3RoIGFuZCBzb2NpYWwgcHJvZ3Jlc3MuDQoNCi0gICBUaGUgQ09WSUQtMTkgcGFuZGVtaWMgbWF5IGhhdmUgaGFkIGFuIGltcGFjdCBvbiB0aGUgZGVjbGluZSBpbiBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIGFzIGdvdmVybm1lbnRzIGhhdmUgYmVlbiBmb3JjZWQgdG8gc3BlbmQgbW9yZSBvbiBoZWFsdGhjYXJlIGFuZCBvdGhlciBlc3NlbnRpYWwgc2VydmljZXMuIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB0aGUgZGVjbGluZSB3YXMgZHVlIHRvIG90aGVyIGZhY3RvcnMsIHN1Y2ggYXMgYXVzdGVyaXR5IG1lYXN1cmVzIG9yIGEgbGFjayBvZiBwb2xpdGljYWwgY29tbWl0bWVudCB0byBlZHVjYXRpb24uDQoNCi0gICBUaGUgZmFjdCB0aGF0IG9ubHkgKipFdXJvcGUgJiBDZW50cmFsIEFzaWEqKiBleHBlcmllbmNlZCBhbiBpbmNyZWFzZSBpbiBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgc3VnZ2VzdHMgdGhhdCB0aGlzIHJlZ2lvbiBpcyBtb3JlIGNvbW1pdHRlZCB0byBlZHVjYXRpb24gdGhhbiBvdGhlciByZWdpb25zLiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhIG51bWJlciBvZiBmYWN0b3JzLCBzdWNoIGFzIGEgc3Ryb25nIGN1bHR1cmFsIGVtcGhhc2lzIG9uIGVkdWNhdGlvbiBvciBhIGJlbGllZiB0aGF0IGVkdWNhdGlvbiBpcyBlc3NlbnRpYWwgZm9yIGVjb25vbWljIGNvbXBldGl0aXZlbmVzcy4NCg0KSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGlzIGdyYXBoIG9ubHkgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZXMgZm9yIGVhY2ggcmVnaW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIHdpdGhpbiBlYWNoIHJlZ2lvbi4gRm9yIGV4YW1wbGUsIHNvbWUgY291bnRyaWVzIG1heSBoYXZlIGluY3JlYXNlZCB0aGVpciBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUsIGV2ZW4gdGhvdWdoIHRoZSBtZWRpYW4gdmFsdWUgZm9yIHRoZWlyIHJlZ2lvbiBoYXMgZGVjbGluZWQuDQoNCk92ZXJhbGwsIHRoaXMgZ3JhcGggaXMgYSB3b3JyeWluZyBzaWduIHRoYXQgZWR1Y2F0aW9uIGlzIGJlaW5nIG5lZ2xlY3RlZCBieSBtYW55IGdvdmVybm1lbnRzLiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCBlZHVjYXRpb24gaXMgYW4gZXNzZW50aWFsIGludmVzdG1lbnQgZm9yIHRoZSBmdXR1cmUsIGFuZCBnb3Zlcm5tZW50cyBzaG91bGQgYmUgZG9pbmcgbW9yZSB0byBzdXBwb3J0IGl0Lg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplY296ZWR1Y2V4cF9kZiA8LSBlZHVjZXhwX2RmIHw+DQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgI3w+DQogICMgc2VsZWN0KFllYXIsIFJlZ2lvbiwgVmFsdWUpDQojdmlldyhlY296X2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZWNvemVkdWNleHBfZGYsICJkYXRhL3RpZHkvZWNvemVkdWNleHBfZGYueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQplY296bWVkaWFuIDwtIGVjb3plZHVjZXhwX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAyOioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgZm9yIGRpZmZlcmVudCBJbmNvbWUgZ3JvdXBzIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2fQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICBlY296ZWR1Y2V4cF9kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IGBJbmNvbWUgZ3JvdXBgLA0KICAgICAgIyBsaW5ldHlwZSA9IGBJbmNvbWUgZ3JvdXBgDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IDAuOSkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSBlY296bWVkaWFuLA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gY3Jvc3NlY296bWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMQ0KICAgICkgKw0KICAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTksIHkgPSAwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1pbmNvbWUgZ3JvdXAgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJkYXJrZ3JlZW4iLCAiYnJvd24iDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSINCiAgICApDQopDQpgYGANCg0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KKipUaGUgbGluZSBncmFwaCBhYm92ZSBzaG93cyB0aGUgbWVkaWFuIHZhbHVlIHRyZW5kcyBvZiB0aGUgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlICglKSBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuKioNCg0KLSAgIFRoZSBjcm9zcy1yZWdpb25hbCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgKCUpIGhhcyBkZWNsaW5lZCBieSAqKjIuMSoqIHBlcmNlbnRhZ2UgcG9pbnRzIGJldHdlZW4gMjAxNiBhbmQgMjAyMi4gVGhpcyBzdWdnZXN0cyB0aGF0IGVkdWNhdGlvbiBpcyBiZWluZyBnaXZlbiBhIGxvd2VyIHByaW9yaXR5IHRoYW4gb3RoZXIgc2VjdG9ycywgc3VjaCBhcyBoZWFsdGggb3IgaW5mcmFzdHJ1Y3R1cmUgZXRjLg0KLSAgIFRoZSBkZWNsaW5lIGluIGVkdWNhdGlvbiBzcGVuZGluZyBoYXMgYmVlbiBtb3N0IHByb25vdW5jZWQgaW4gTG93ZXIgbWlkZGxlIGluY29tZSBjb3VudHJpZXMuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgbnVtYmVyIG9mIGZhY3RvcnMsIHN1Y2ggYXMgdGhlc2UgY291bnRyaWVzIGhhdmUgYmVlbiBkaXNwcm9wb3J0aW9uYXRlbHkgYWZmZWN0ZWQgYnkgdGhlIENPVklELTE5IHBhbmRlbWljIG9yIGhhdmluZyB3ZWFrZXIgZWNvbm9taWMgZ3Jvd3RoLg0KLSAgIFRoZSBkZWNsaW5lIGluIGVkdWNhdGlvbiBzcGVuZGluZyBpcyBtb3JlIHByb25vdW5jZWQgYWZ0ZXIgMjAxOC4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBtaWdodCBoYXMgaGFkIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIGVkdWNhdGlvbiBzcGVuZGluZy4NCi0gICBUaGUgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlICglKSBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIFNER3MgNCB0byBhcHByZWNpYXRlIHRoZSBwcmlvcml0eSBnaXZlbiBieSBjb3VudHJpZXMgdG8gZWR1Y2F0aW9uLiBUaGUgZGVjbGluZSBpbiBlZHVjYXRpb24gc3BlbmRpbmcgc3VnZ2VzdHMgdGhhdCBjb3VudHJpZXMgYXJlIG5vdCBnaXZpbmcgZWR1Y2F0aW9uIHRoZSBwcmlvcml0eSBpdCBkZXNlcnZlcy4NCg0KYGBgICAgICAgICAgDQpIZXJlIGFyZSBzb21lIG9mIHRoZSBpbXBvcnRhbnQgZmlndXJlcyBmcm9tIHRoZSBncmFwaDoNCg0KLSAgIFRoZSBjcm9zcy1yZWdpb25hbCBtZWRpYW4gZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlICglKSBpbiAyMDE1IHdhcyAxNS45JS4NCi0gICBUaGUgY3Jvc3MtcmVnaW9uYWwgbWVkaWFuIGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSAoJSkgaW4gMjAyMiB3YXMgMTMuOCUuDQotICAgVGhlIGxhcmdlc3QgZGVjbGluZSBpbiBlZHVjYXRpb24gc3BlbmRpbmcgd2FzIGluIExvd2VyIG1pZGRsZSBpbmNvbWUgY291bnRyaWVzLCB3aGVyZSB0aGUgbWVkaWFuIGV4cGVuZGl0dXJlIGZlbGwgZnJvbSAxNi4zJSBpbiAyMDE2IHRvIDEzLjElIGluIDIwMjIuDQoNCk92ZXJhbGwsIHRoZSBncmFwaCBzaG93cyB0aGF0IGVkdWNhdGlvbiBzcGVuZGluZyBpcyBkZWNsaW5pbmcgYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUuIFRoaXMgaXMgYSB3b3JyeWluZyB0cmVuZCwgYXMgZWR1Y2F0aW9uIGlzIGVzc2VudGlhbCBmb3IgZWNvbm9taWMgZGV2ZWxvcG1lbnQgYW5kIHBvdmVydHkgcmVkdWN0aW9uLiBUaGUgQ09WSUQtMTkgcGFuZGVtaWMgaGFzIGV4YWNlcmJhdGVkIHRoaXMgdHJlbmQsIGFuZCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBjb3VudHJpZXMgdGFrZSBzdGVwcyB0byBpbmNyZWFzZSBlZHVjYXRpb24gc3BlbmRpbmcgaW4gb3JkZXIgdG8gbWVldCB0aGUgU0RHcyA0Lg0KDQpIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdGhvdWdodHMgb24gdGhlIGdyYXBoOg0KDQotICAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZ3JhcGggb25seSBzaG93cyBtZWRpYW4gdmFsdWVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgdmFyaWF0aW9uIGluIGVkdWNhdGlvbiBzcGVuZGluZyBiZXR3ZWVuIGNvdW50cmllcyB3aXRoaW4gZWFjaCBpbmNvbWUgZ3JvdXAuDQotICAgVGhlIGdyYXBoIGRvZXMgbm90IHNob3cgdGhlIHJlYXNvbnMgZm9yIHRoZSBkZWNsaW5lIGluIGVkdWNhdGlvbiBzcGVuZGluZy4gTW9yZSByZXNlYXJjaCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB3aHkgZWR1Y2F0aW9uIHNwZW5kaW5nIGlzIGRlY2xpbmluZyBhbmQgd2hhdCBjYW4gYmUgZG9uZSB0byByZXZlcnNlIHRoaXMgdHJlbmQuDQpgYGANCg0KIyMgQW5hbHlzaXMgb2YgR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCAoJSkNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmdvdmV4cF9kZiA8LSBkZiB8Pg0KICBmaWx0ZXIoDQogICAgWWVhciAlaW4lIHNlcSgyMDE1LCAyMDIyKSwNCiAgICBgSW5kaWNhdG9yIE5hbWVgID09ICJHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQICglKSINCiAgKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZ292ZXhwX2RmLCAiZGF0YS90aWR5L2dvdmV4cF9kZi54bHN4IikNCiMgZ2xpbXBzZShnb3ZleHBfZGYpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmdvdmV4cHJlZ19kZiA8LSBnb3ZleHBfZGYgfD4NCiAgZ3JvdXBfYnkocmVnaW9uLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDQpDQogICMgc2VsZWN0KFllYXIsIFJlZ2lvbiwgVmFsdWUpDQojdmlldyhyZWdfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChnb3ZleHByZWdfZGYsICJkYXRhL3RpZHkvZ292ZXhwcmVnX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcmVnbWVkaWFuIDwtIGdvdmV4cHJlZ19kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NyZWdtZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSAzOioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgR0RQIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2fQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICBnb3ZleHByZWdfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSByZWdpb24NCiAgICAgICMgbGluZXR5cGUgPSByZWdpb24NCiAgICApDQogICkgKw0KICAgIGdlb21fbGluZShzaXplID0gLjgpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gcmVnbWVkaWFuLA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gY3Jvc3NyZWdtZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAuNSwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgICB2YWx1ZXMgPSBjKA0KICAgICAgICAiZG9kZ2VyYmx1ZSIsICJvcmFuZ2UzIiwgInB1cnBsZTMiLCAiYnJvd240IiwgImRhcmtibHVlIiwgImRhcmtncmVlbiIsICAicGluazMiDQogICAgICApDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICkgKw0KICAgICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoKSkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgR0RQIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLioqDQoNCi0gICAqKk92ZXJhbGwgZG93bndhcmQgdHJlbmQ6KiogVGhlIGNyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZSBkZWNyZWFzZWQgZnJvbSA0LjYlIGluIDIwMTUgdG8gMy4yJSBpbiAyMDIyLiBUaGlzIG1lYW5zIHRoYXQgZ292ZXJubWVudCBzcGVuZGluZyBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCBoYXMgZGVjbGluZWQgZ2xvYmFsbHkuDQotICAgKipSZWdpb25hbCB2YXJpYXRpb25zOioqIFRoZSBkZWNsaW5lIGhhcyBiZWVuIG1vc3QgcHJvbm91bmNlZCBpbiBOb3J0aCBBbWVyaWNhIGFuZCB0aGUgTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EsIHdpdGggZGVjcmVhc2VzIG9mIDEuNyUgYW5kIDEuNiUgcG9pbnRzLCByZXNwZWN0aXZlbHkuIEV1cm9wZSAmIENlbnRyYWwgQXNpYSBpcyB0aGUgb25seSByZWdpb24gdGhhdCBoYXMgc2VlbiBhIHNsaWdodCBpbmNyZWFzZSAoMC40JSBwb2ludHMpLg0KLSAgICoqRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldDoqKiBJbiAyMDIyLCBhbGwgcmVnaW9ucyBleGNlcHQgRXVyb3BlICYgQ2VudHJhbCBBc2lhIGZlbGwgYmVsb3cgdGhlIDQlIEVkdWNhdGlvbiAyMDMwIEZGQSB0YXJnZXQgZm9yIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiBHRFAuIFRoZSBjcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUgd2FzIDMuMiUsIHdoaWNoIGlzIHNpZ25pZmljYW50bHkgYmVsb3cgdGhlIHRhcmdldC4NCi0gICAqKlBvc3NpYmxlIGltcGFjdCBvZiBDT1ZJRC0xOToqKiBUaGUgZG93bndhcmQgdHJlbmQgYmVnYW4gaW4gMjAxNiBhbmQgYmVjYW1lIG1vcmUgcHJvbm91bmNlZCBhZnRlciAyMDE5LiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIENPVklELTE5IHBhbmRlbWljIG1heSBoYXZlIGhhZCBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBnb3Zlcm5tZW50IHNwZW5kaW5nIG9uIGVkdWNhdGlvbi4NCi0gICAqKlN1Yi1TYWhhcmFuIEFmcmljYToqKiBUaGlzIHJlZ2lvbiBoYXMgY29uc2lzdGVudGx5IGZhbGxlbiBiZWxvdyB0aGUgNCUgRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldCwgZGVzcGl0ZSBhIHNsaWdodCBpbmNyZWFzZSBiZXR3ZWVuIDIwMTUgYW5kIDIwMjAuDQotICAgKipTb3V0aCBBc2lhOioqIFRoaXMgcmVnaW9uIHJlYWNoZWQgdGhlIDQlIHRhcmdldCBpbiAyMDIwIGFmdGVyIGEgc2lnbmlmaWNhbnQgdXB3YXJkIHRyZW5kLCBidXQgaGFzIHNpbmNlIGZhbGxlbiBiYWNrIGJlbG93IHRoZSB0YXJnZXQgaW4gMjAyMSBhbmQgMjAyMiwgd2l0aCBhIHBhcnRpY3VsYXJseSBzaGFycCBkZWNsaW5lIGluIDIwMjIuDQoNCmBgYCAgICAgICAgIA0KSGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIGltcG9ydGFudCBmaWd1cmVzIHRvIG5vdGU6DQoNCiogVGhlIG1lZGlhbiBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQIGluIDIwMjIgd2FzIDMuMiUuDQoqIFRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IGlzIDQlLg0KKiBUaGUgbGFyZ2VzdCBkZWNsaW5lIGluIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiBHRFAgd2FzIGluIE5vcnRoIEFtZXJpY2EgKDEuNyUgcG9pbnRzKS4NCiogVGhlIG9ubHkgcmVnaW9uIHRvIGluY3JlYXNlIGl0cyBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgR0RQIHdhcyBFdXJvcGUgJiBDZW50cmFsIEFzaWEgKDAuNCUgcG9pbnRzKS4NCg0KT3ZlcmFsbCwgdGhlIGdyYXBoIHNob3dzIGEgY29uY2VybmluZyB0cmVuZCBvZiBkZWNsaW5pbmcgZ292ZXJubWVudCBzcGVuZGluZyBvbiBlZHVjYXRpb24gYWNyb3NzIG1vc3QgcmVnaW9ucy4gVGhlIENPVklELTE5IHBhbmRlbWljIG1heSBoYXZlIHBsYXllZCBhIHJvbGUgaW4gdGhpcyBkZWNsaW5lLCBidXQgZnVydGhlciByZXNlYXJjaCBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSBmdWxsIGV4dGVudCBvZiBpdHMgaW1wYWN0Lg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQplY296Z292ZXhwX2RmIDwtIGdvdmV4cF9kZiB8Pg0KICBncm91cF9ieShgSW5jb21lIGdyb3VwYCwgWWVhcikgfD4NCiAgc3VtbWFyaXplKG1lZGlhbl92YWx1ZSA9IG1lZGlhbihWYWx1ZSkpIHw+DQogIG11dGF0ZSh0YXJnZXQgPSA0KQ0KI3ZpZXcoZWNvel9kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGVjb3pnb3ZleHBfZGYsICJkYXRhL3RpZHkvZWNvemdvdmV4cF9kZi54bHN4IikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmVjb3ptZWRpYW4gPC0gZWNvemdvdmV4cF9kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NlY296bWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQojIGVjb3ptZWRpYW4NCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSA0OioqIE1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgR0RQIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgZWNvemdvdmV4cF9kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IGBJbmNvbWUgZ3JvdXBgDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gZWNvem1lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzZWNvem1lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fbGluZShhZXMoKSwgc2l6ZSA9IDAuOCkgKw0KICAgICMgZ2VvbV9wb2ludChzaXplID0gMy41KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLjUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJyZWQ0IiwgImJyb3duIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIGdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgR0RQIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4qKg0KDQoqKk92ZXJhbGwgZG93bndhcmQgdHJlbmQ6KioNCg0KLSAgIFRoZSBtZWRpYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCBoYXMgZGVjbGluZWQgZnJvbSA0LjQlIGluIDIwMTUgdG8gMy42JSBpbiAyMDIyLiBUaGlzIG1lYW5zIHRoYXQgZWR1Y2F0aW9uIGlzIGdldHRpbmcgYSBzbWFsbGVyIHNoYXJlIG9mIGdvdmVybm1lbnQgYnVkZ2V0cyBhY3Jvc3MgdGhlIGdsb2JlLg0KLSAgIFRoaXMgZGVjbGluZSBpcyBwYXJ0aWN1bGFybHkgY29uY2VybmluZyBiZWNhdXNlIGVkdWNhdGlvbiBpcyBjcnVjaWFsIGZvciBlY29ub21pYyBkZXZlbG9wbWVudCwgcG92ZXJ0eSByZWR1Y3Rpb24sIGFuZCBzb2NpYWwgcHJvZ3Jlc3MuDQoNCioqUmVnaW9uYWwgdmFyaWF0aW9uczoqKg0KDQotICAgVGhlIGRlY2xpbmUgaGFzIGJlZW4gbW9zdCBwcm9ub3VuY2VkIGluIGhpZ2gtaW5jb21lIGNvdW50cmllcywgd2l0aCBhIGRlY3JlYXNlIG9mIDEuMSBwZXJjZW50YWdlIHBvaW50cyBzaW5jZSAyMDE1LiBUaGlzIGlzIHN1cnByaXNpbmcsIGFzIHRoZXNlIGNvdW50cmllcyB0ZW5kIHRvIGhhdmUgbW9yZSByZXNvdXJjZXMgYXZhaWxhYmxlIGZvciBlZHVjYXRpb24uDQotICAgVXBwZXItbWlkZGxlLWluY29tZSBjb3VudHJpZXMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBzdGlsbCBtZWV0IHRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IG9mIDQlIHNwZW5kaW5nIG9uIGVkdWNhdGlvbi4NCi0gICBMb3ctaW5jb21lIGNvdW50cmllcyBoYXZlIGNvbnNpc3RlbnRseSBmYWxsZW4gYmVsb3cgdGhlIHRhcmdldCwgZGVzcGl0ZSBhIHNtYWxsIGluY3JlYXNlIGJldHdlZW4gMjAxNSBhbmQgMjAyMS4gSG93ZXZlciwgdGhlaXIgc3BlbmRpbmcgaGFzIGFsc28gZmFsbGVuIGJhY2sgYmVsb3cgMjAxNSBsZXZlbHMgc2luY2UgMjAyMi4NCg0KKipQb3NzaWJsZSBpbXBhY3Qgb2YgQ09WSUQtMTk6KioNCg0KLSAgIFRoZSBkb3dud2FyZCB0cmVuZCBpbiBlZHVjYXRpb24gc3BlbmRpbmcgYmVnYW4gaW4gMjAxNiBhbmQgYmVjYW1lIG1vcmUgcHJvbm91bmNlZCBhZnRlciAyMDE5LiBUaGlzIGNvaW5jaWRlcyB3aXRoIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYywgc3VnZ2VzdGluZyB0aGF0IGl0IG1heSBoYXZlIHBsYXllZCBhIHNpZ25pZmljYW50IHJvbGUgaW4gdGhlIGRlY2xpbmUuDQotICAgR292ZXJubWVudHMgbWF5IGhhdmUgYmVlbiBmb3JjZWQgdG8gY3V0IGVkdWNhdGlvbiBzcGVuZGluZyB0byBkZWFsIHdpdGggdGhlIGVjb25vbWljIGFuZCBoZWFsdGggY2hhbGxlbmdlcyBvZiB0aGUgcGFuZGVtaWMuDQoNCioqSW1wb3J0YW50IGZpZ3VyZXM6KioNCg0KLSAgIFRoZSBtZWRpYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCBpbiAyMDIyIHdhcyAzLjYlLg0KLSAgIFRoZSBFZHVjYXRpb24gMjAzMCBGRkEgdGFyZ2V0IGlzIDQlLg0KLSAgIFRoZSBsYXJnZXN0IGRlY2xpbmUgaW4gZ292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIEdEUCB3YXMgaW4gaGlnaC1pbmNvbWUgY291bnRyaWVzICgxLjEgcGVyY2VudGFnZSBwb2ludHMpLg0KDQoqKkNhbGwgdG8gYWN0aW9uOioqDQoNClRoaXMgZG93bndhcmQgdHJlbmQgaW4gZWR1Y2F0aW9uIHNwZW5kaW5nIGlzIGFsYXJtaW5nIGFuZCBuZWVkcyB0byBiZSByZXZlcnNlZC4gR292ZXJubWVudHMgc2hvdWxkIHByaW9yaXRpemUgZWR1Y2F0aW9uIHNwZW5kaW5nIGFuZCBlbnN1cmUgdGhhdCBpdCBtZWV0cyB0aGUgRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldCBwcm92aWRlZCB3ZSBhcmUgYWxtb3N0IGluIGhhbGYgd2F5LiBUaGlzIHdpbGwgcmVxdWlyZSBpbnZlc3RpbmcgbW9yZSByZXNvdXJjZXMgaW4gZWR1Y2F0aW9uLCBldmVuIGluIHRoZSBmYWNlIG9mIG90aGVyIGNoYWxsZW5nZXMuIEludmVzdGluZyBpbiBlZHVjYXRpb24gaXMgbm90IGp1c3QgYW4gZXhwZW5zZTsgaXQgaXMgYW4gaW52ZXN0bWVudCBpbiB0aGUgZnV0dXJlLg0KDQojIyBBbmFseXNpcyBvZiB0aGUgb3V0LW9mLXNjaG9vbCByYXRlIGZvciBjaGlsZHJlbiBvZiBwcmltYXJ5IHNjaG9vbCBhZ2UsIGJvdGggc2V4ZXMgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpvc3JfZGYgPC0gZGYgfD4NCiAgZmlsdGVyKA0KICAgIFllYXIgJWluJSBzZXEoMjAxNSwgMjAyMSksDQogICAgYEluZGljYXRvciBOYW1lYCA9PSAiT3V0LW9mLXNjaG9vbCByYXRlIGZvciBjaGlsZHJlbiBvZiBwcmltYXJ5IHNjaG9vbCBhZ2UsIGJvdGggc2V4ZXMgKCUpIg0KICApDQpvcGVueGxzeDo6d3JpdGUueGxzeChvc3JfZGYsICJkYXRhL3RpZHkvb3NyX2RmLnhsc3giKQ0KIyBnbGltcHNlKG9zcl9kZikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KcmVnb3NyX2RmIDwtIG9zcl9kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ29zcl9kZiwgImRhdGEvdGlkeS9yZWdvc3JfZGYueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZWdtZWRpYW4gPC0gcmVnb3NyX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc3JlZ21lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgNToqKiBNZWRpYW4gdmFsdWUgb2YgdGhlIG91dC1vZi1zY2hvb2wgcmF0ZSBmb3IgY2hpbGRyZW4gb2YgcHJpbWFyeSBzY2hvb2wgYWdlIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGggPSA5LjUsIGZpZy5oZWlnaHQgPSA2fQ0KZ2dwbG90bHkoDQogIGdncGxvdCgNCiAgICByZWdvc3JfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSByZWdpb24NCiAgICApDQogICkgKw0KICAgIGdlb21fbGluZShzaXplID0gLjgpICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBkYXRhID0gcmVnbWVkaWFuLA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gY3Jvc3NyZWdtZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDE2LCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gMCwgeWVuZCA9IDE4KSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRvZGdlcmJsdWUiLCAib3JhbmdlMyIsICJwdXJwbGUzIiwgImJyb3duNCIsICJkYXJrYmx1ZSIsICJkYXJrZ3JlZW4iLCAgInBpbmszIg0KICAgICAgKQ0KICAgICkgICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTksIHkgPSA4LA0KICAgICAgICAgIGxhYmVsID0gIlRoZSBnYXAgYmV0d2VlbiB0aGUgdGFyZ2V0XG4gYW5kIFN1Yi1TYWhhcmFuIEFmcmljYSdzXG4gdmFsdWUgaW4gMjAyMSBpcyAxOC40Ig0KICAgICAgICApLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOSwgeSA9IC0yLCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiLA0KICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvIg0KICAgICkgDQopDQpgYGANCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCioqVGhlIGxpbmUgZ3JhcGggYWJvdmUgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZSB0cmVuZHMgb2YgdGhlIE91dC1vZi1zY2hvb2wgcmF0ZSBmb3IgY2hpbGRyZW4gb2YgcHJpbWFyeSBzY2hvb2wgYWdlLCBib3RoIHNleGVzIGZvciBkaWZmZXJlbnQgcmVnaW9uIGZyb20gMjAxNSB0byAyMDIyLioqDQoNCkhlcmUgYXJlIHNvbWUgb2YgdGhlIGtleSBpbnNpZ2h0cyB3ZSBjYW4gZ2xlYW4gZnJvbSB0aGlzIGRhdGE6DQoNCiogKipPdmVyYWxsIGluY3JlYXNlIGluIG91dC1vZi1zY2hvb2wgY2hpbGRyZW46KiogVGhlIGNyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZSBpbmNyZWFzZWQgZnJvbSAyLjYlIGluIDIwMTUgdG8gNC40JSBpbiAyMDIyLCBleGNlZWRpbmcgdGhlIEVkdWNhdGlvbiAyMDMwIEZGQSB0YXJnZXQgb2YgMCUuIFRoaXMgbWVhbnMgdGhhdCBvbiBhdmVyYWdlLCBtb3JlIGNoaWxkcmVuIGFyZSBvdXQgb2Ygc2Nob29sIG5vdyB0aGFuIGluIDIwMTUuDQoqICoqRGlzcGFyaXRpZXMgYmV0d2VlbiByZWdpb25zOioqIFRoZSBpbmNyZWFzZSBoYXMgYmVlbiBtb3N0IHByb25vdW5jZWQgaW4gU3ViLVNhaGFyYW4gQWZyaWNhLCB3aGVyZSB0aGUgbWVkaWFuIHZhbHVlIGluY3JlYXNlZCBieSAzLjEgcGVyY2VudGFnZSBwb2ludHMgYmV0d2VlbiAyMDE1IGFuZCAyMDIyLiBUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgU3ViLVNhaGFyYW4gQWZyaWNhJ3MgdmFsdWUgaW4gMjAyMSBpcyBhIHNpZ25pZmljYW50IDE4LjQgcGVyY2VudGFnZSBwb2ludHMuDQoqIFRoZSBTdWItU2FoYXJhbiBBZnJpY2FuLCBTb3V0aCBBc2lhIGFuZCBMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIHJlZ2lvbnMgaGF2ZSBjb25zaXN0ZW50bHkgZXZvbGRlZCBvdmVyaGVhZCB0aGUgY3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlc2UgcmVnaW9ucyBhcmUgbm90IG1ha2luZyBwcm9ncmVzcyB0b3dhcmRzIGFjaGlldmluZyB1bml2ZXJzYWwgcHJpbWFyeSBlZHVjYXRpb24uDQoqICoqUG90ZW50aWFsIGNhdXNlczoqKiBUaGUgQ09WSUQtMTkgcGFuZGVtaWMgbWF5IGhhdmUgcGxheWVkIGEgcm9sZSBpbiB0aGlzIGluY3JlYXNlLCBhcyBtYW55IHNjaG9vbHMgd2VyZSBjbG9zZWQgZHVyaW5nIHRoZSBwYW5kZW1pYy4gSG93ZXZlciwgb3RoZXIgZmFjdG9ycywgc3VjaCBhcyBwb3ZlcnR5IG9yIGNvbmZsaWN0LCBtYXkgYWxzbyBoYXZlIGNvbnRyaWJ1dGVkLg0KKiAqKkltcG9ydGFuY2Ugb2YgZWR1Y2F0aW9uOioqIEVkdWNhdGlvbiBpcyBlc3NlbnRpYWwgZm9yIGVjb25vbWljIGRldmVsb3BtZW50IGFuZCBwb3ZlcnR5IHJlZHVjdGlvbi4gVGhlIGluY3JlYXNpbmcgb3V0LW9mLXNjaG9vbCByYXRlIGlzIGEgd29ycnlpbmcgdHJlbmQgdGhhdCBjb3VsZCBoYXZlIG5lZ2F0aXZlIGNvbnNlcXVlbmNlcyBmb3IgdGhlc2UgcmVnaW9ucyBpbiB0aGUgbG9uZyB0ZXJtLg0KDQpIZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdGhvdWdodHMgb24gdGhlIGRhdGE6DQoNCiogVGhlIGdyYXBoIG9ubHkgc2hvd3MgdGhlIG1lZGlhbiB2YWx1ZXMgZm9yIGVhY2ggcmVnaW9uLiBJdCB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBzZWUgdGhlIGZ1bGwgcmFuZ2Ugb2YgZGF0YSBmb3IgZWFjaCByZWdpb24gdG8gZ2V0IGEgYmV0dGVyIHNlbnNlIG9mIHRoZSB2YXJpYWJpbGl0eSB3aXRoaW4gZWFjaCByZWdpb24uDQoqIFRoZSBncmFwaCBkb2VzIG5vdCBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVhc29ucyB3aHkgY2hpbGRyZW4gYXJlIG91dCBvZiBzY2hvb2wuIEl0IHdvdWxkIGJlIGhlbHBmdWwgdG8gaGF2ZSBtb3JlIGRhdGEgb24gdGhpcyB0byBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgcHJvYmxlbSBhbmQgZGV2ZWxvcCBlZmZlY3RpdmUgaW50ZXJ2ZW50aW9ucy4NCiogRGVzcGl0ZSB0aGUgb3ZlcmFsbCBpbmNyZWFzZSwgdGhlcmUgbWF5IGJlIHNvbWUgcmVnaW9ucyBvciBjb3VudHJpZXMgdGhhdCBhcmUgbWFraW5nIHByb2dyZXNzIGluIHJlZHVjaW5nIHRoZWlyIG91dC1vZi1zY2hvb2wgcmF0ZXMuIEl0IGlzIGltcG9ydGFudCB0byBpZGVudGlmeSBhbmQgc2hhcmUgYmVzdCBwcmFjdGljZXMgZnJvbSB0aGVzZSBzdWNjZXNzIHN0b3JpZXMuDQoNCk92ZXJhbGwsIHRoZSBsaW5lIGdyYXBoIGhpZ2hsaWdodHMgYSBzZXJpb3VzIHByb2JsZW0gdGhhdCBuZWVkcyB0byBiZSBhZGRyZXNzZWQuIE1vcmUgcmVzZWFyY2ggaXMgbmVlZGVkIHRvIHVuZGVyc3RhbmQgdGhlIGNhdXNlcyBvZiB0aGUgaW5jcmVhc2UgaW4gb3V0LW9mLXNjaG9vbCBjaGlsZHJlbiwgYW5kIGVmZmVjdGl2ZSBpbnRlcnZlbnRpb25zIGFyZSBuZWVkZWQgdG8gZ2V0IG1vcmUgY2hpbGRyZW4gYmFjayBpbnRvIHNjaG9vbC4NCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KZWNvem9zcl9kZiA8LSBvc3JfZGYgfD4NCiAgZ3JvdXBfYnkoYEluY29tZSBncm91cGAsIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KGVjb3pfZGYpDQpvcGVueGxzeDo6d3JpdGUueGxzeChlY296b3NyX2RmLCAiZGF0YS90aWR5L2Vjb3pvc3JfZGYueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQplY296bWVkaWFuIDwtIGVjb3pvc3JfZGYgfD4NCiAgZ3JvdXBfYnkoWWVhcikgfD4NCiAgc3VtbWFyaXplKGNyb3NzZWNvem1lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgNjoqKiBNZWRpYW4gdmFsdWUgb2YgdGhlIG91dC1vZi1zY2hvb2wgcmF0ZSBmb3IgY2hpbGRyZW4gb2YgcHJpbWFyeSBzY2hvb2wgYWdlIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgZWNvem9zcl9kZiwNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IGBJbmNvbWUgZ3JvdXBgDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IC44KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IGVjb3ptZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc2Vjb3ptZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDEwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1pbmNvbWUgZ3JvdXAgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgZ2VvbV9zZWdtZW50KA0KICAgICAgYWVzKHggPSAyMDIxLCB4ZW5kID0gMjAyMSwgeSA9IDAsIHllbmQgPSAyNSksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJwaW5rMyIsInB1cnBsZTMiICwgImRhcmtibHVlIiwgIm9yYW5nZTMiDQogICAgICApDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE5LCB5ID0gMTcsDQogICAgICAgICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgbG93IGluY29tZSBjb3VudHJpZXMnXG4gdmFsdWUgaW4gMjAyMSBpcyAyNC44Ig0KICAgICAgICApLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOSwgeSA9IC0yLCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQoqKlRoZSBsaW5lIGdyYXBoIGFib3ZlIHNob3dzIHRoZSBtZWRpYW4gdmFsdWUgdHJlbmRzIG9mIHRoZSBvdXQtb2Ytc2Nob29sIHJhdGUgZm9yIGNoaWxkcmVuIG9mIHByaW1hcnkgc2Nob29sIGFnZSBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuKioNCg0KSGVyZSBhcmUgc29tZSBvZiB0aGUga2V5IGluc2lnaHRzIHdlIGNhbiBnbGVhbiBmcm9tIHRoaXMgZGF0YToNCg0KKiAqKk92ZXJhbGwgaW5jcmVhc2UgaW4gb3V0LW9mLXNjaG9vbCBjaGlsZHJlbjoqKiBUaGUgbWVkaWFuIHZhbHVlIGluY3JlYXNlZCBmcm9tIDQuOCUgaW4gMjAxNSB0byA1LjUlIGluIDIwMjIsIGV4Y2VlZGluZyB0aGUgRWR1Y2F0aW9uIDIwMzAgRkZBIHRhcmdldCBvZiAwJS4gVGhpcyBtZWFucyB0aGF0IG9uIGF2ZXJhZ2UsIG1vcmUgY2hpbGRyZW4gYXJlIG91dCBvZiBzY2hvb2wgbm93IHRoYW4gaW4gMjAxNS4NCiogKipEaXNwYXJpdGllcyBiZXR3ZWVuIGluY29tZSBncm91cHM6KiogVGhlIGluY3JlYXNlIGhhcyBiZWVuIG1vc3QgcHJvbm91bmNlZCBpbiBsb3ctaW5jb21lIGNvdW50cmllcywgd2hlcmUgdGhlIG1lZGlhbiB2YWx1ZSBpbmNyZWFzZWQgYnkgMy4xIHBlcmNlbnRhZ2UgcG9pbnRzIGJldHdlZW4gMjAxNSBhbmQgMjAyMi4gVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIGxvdyBpbmNvbWUgY291bnRyaWVzJyB2YWx1ZSBpbiAyMDIxIGlzIGEgc2lnbmlmaWNhbnQgMjQuOCBwZXJjZW50YWdlIHBvaW50cy4NCiogKipQb3RlbnRpYWwgY2F1c2VzOioqIFRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBtYXkgaGF2ZSBwbGF5ZWQgYSByb2xlIGluIHRoaXMgaW5jcmVhc2UsIGFzIG1hbnkgc2Nob29scyB3ZXJlIGNsb3NlZCBkdXJpbmcgdGhlIHBhbmRlbWljLiBIb3dldmVyLCBvdGhlciBmYWN0b3JzLCBzdWNoIGFzIHBvdmVydHkgb3IgY29uZmxpY3QsIG1heSBhbHNvIGhhdmUgY29udHJpYnV0ZWQuDQoqICoqSW1wb3J0YW5jZSBvZiBlZHVjYXRpb246KiogRWR1Y2F0aW9uIGlzIGVzc2VudGlhbCBmb3IgZWNvbm9taWMgZGV2ZWxvcG1lbnQgYW5kIHBvdmVydHkgcmVkdWN0aW9uLiBUaGUgaW5jcmVhc2luZyBvdXQtb2Ytc2Nob29sIHJhdGUgaXMgYSB3b3JyeWluZyB0cmVuZCB0aGF0IGNvdWxkIGhhdmUgbmVnYXRpdmUgY29uc2VxdWVuY2VzIGZvciB0aGVzZSByZWdpb25zIGluIHRoZSBsb25nIHRlcm0uDQoNCkhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0aG91Z2h0cyBvbiB0aGUgZGF0YToNCg0KKiBUaGUgZ3JhcGggb25seSBzaG93cyB0aGUgbWVkaWFuIHZhbHVlcyBmb3IgZWFjaCByZWdpb24uIEl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHNlZSB0aGUgZnVsbCByYW5nZSBvZiBkYXRhIGZvciBlYWNoIHJlZ2lvbiB0byBnZXQgYSBiZXR0ZXIgc2Vuc2Ugb2YgdGhlIHZhcmlhYmlsaXR5IHdpdGhpbiBlYWNoIHJlZ2lvbi4NCiogVGhlIGdyYXBoIGRvZXMgbm90IHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIG9uIHRoZSByZWFzb25zIHdoeSBjaGlsZHJlbiBhcmUgb3V0IG9mIHNjaG9vbC4gSXQgd291bGQgYmUgaGVscGZ1bCB0byBoYXZlIG1vcmUgZGF0YSBvbiB0aGlzIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtIGFuZCBkZXZlbG9wIGVmZmVjdGl2ZSBpbnRlcnZlbnRpb25zLg0KKiBEZXNwaXRlIHRoZSBvdmVyYWxsIGluY3JlYXNlLCB0aGVyZSBtYXkgYmUgc29tZSByZWdpb25zIG9yIGNvdW50cmllcyB0aGF0IGFyZSBtYWtpbmcgcHJvZ3Jlc3MgaW4gcmVkdWNpbmcgdGhlaXIgb3V0LW9mLXNjaG9vbCByYXRlcy4gSXQgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5IGFuZCBzaGFyZSBiZXN0IHByYWN0aWNlcyBmcm9tIHRoZXNlIHN1Y2Nlc3Mgc3Rvcmllcy4NCg0KT3ZlcmFsbCwgdGhlIGxpbmUgZ3JhcGggaGlnaGxpZ2h0cyBhIHNlcmlvdXMgcHJvYmxlbSB0aGF0IG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4gTW9yZSByZXNlYXJjaCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2F1c2VzIG9mIHRoZSBpbmNyZWFzZSBpbiBvdXQtb2Ytc2Nob29sIGNoaWxkcmVuLCBhbmQgZWZmZWN0aXZlIGludGVydmVudGlvbnMgYXJlIG5lZWRlZCB0byBnZXQgbW9yZSBjaGlsZHJlbiBiYWNrIGludG8gc2Nob29sLg0KDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBDb21wbGV0aW9uIHJhdGUsIHByaW1hcnkgZWR1Y2F0aW9uLCBib3RoIHNleGVzICglKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KY3JwZWR1Y19kZiA8LSBkZiB8Pg0KICBmaWx0ZXIoDQogICAgWWVhciAlaW4lIHNlcSgyMDE1LCAyMDIxKSwNCiAgICBgSW5kaWNhdG9yIE5hbWVgID09ICJDb21wbGV0aW9uIHJhdGUsIHByaW1hcnkgZWR1Y2F0aW9uLCBib3RoIHNleGVzICglKSINCiAgKSANCm9wZW54bHN4Ojp3cml0ZS54bHN4KGNycGVkdWNfZGYsICJkYXRhL3RpZHkvY3JwZWR1Y19kZi54bHN4IikNCiMgZ2xpbXBzZShvc3JfZGYpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCnJlZ2NycGVkdWNfZGYgPC0gY3JwZWR1Y19kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKSAjfD4NCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ2NycGVkdWNfZGYsICJkYXRhL3RpZHkvcmVnY3JwZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnJlZ21lZGlhbiA8LSByZWdjcnBlZHVjX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc3JlZ21lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgNzoqKiBNZWRpYW4gdmFsdWUgdHJlbmQgb2YgdGhlIG9tcGxldGlvbiByYXRlLCBwcmltYXJ5IGVkdWNhdGlvbiwgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDZ9DQpnZ3Bsb3RseSgNCiAgcmVnY3JwZWR1Y19kZiB8Pg0KICAgICMgZmlsdGVyKA0KICAgICMgICByZWdpb24gJWluJSBjKA0KICAgICMgICAgICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiIsICJTdWItU2FoYXJhbiBBZnJpY2EiDQogICAgIyAgICkNCiAgICAjICkgfD4NCiAgICBmaWx0ZXIoIShyZWdpb24gPT0gIlNvdXRoIEFzaWEiKSkgfD4NCiAgZ2dwbG90KA0KICAgIGFlcygNCiAgICAgIHggPSBZZWFyLA0KICAgICAgeSA9IG1lZGlhbl92YWx1ZSwNCiAgICAgIGNvbG9yID0gcmVnaW9uDQogICAgKQ0KICApICsNCiAgICBnZW9tX2xpbmUoc2l6ZSA9IC44KSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IHJlZ21lZGlhbiwNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IGNyb3NzcmVnbWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMS4yDQogICAgKSArDQogICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDAsIGxhYmVsID0gIuKWoCDilqAg4pagIENyb3NzLXJlZ2lvbmFsIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIGFlcyh4ID0gMjAyMSwgeGVuZCA9IDIwMjEsIHkgPSA3My4xNCwgeWVuZCA9IDEwMCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDcyLCANCiAgICAgICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCBTdWItU2FoYXJhbiBBZnJpY2Enc1xuIHZhbHVlIGluIDIwMjEgaXMgMjYuOSINCiAgICAgICAgKSwNCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLjIsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMTUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2dyZWVuIiwgInBpbmszIiwgImRvZGdlcmJsdWUiIA0KICAgICAgKQ0KICAgICkgICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIiwNCiAgICAgIGNhcHRpb24gPSAiU291cmNlOiBodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLyINCiAgICApIA0KKQ0KYGBgDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmVjb3pjcnBlZHVjX2RmIDwtIGNycGVkdWNfZGYgfD4NCiAgZ3JvdXBfYnkoYEluY29tZSBncm91cGAsIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcoZWNvel9kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGVjb3pjcnBlZHVjX2RmLCAiZGF0YS90aWR5L2Vjb3pjcnBlZHVjX2RmLnhsc3giKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQplY296bWVkaWFuIDwtIGVjb3pjcnBlZHVjX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDg6KiogTWVkaWFuIHZhbHVlIHRyZW5kIG9mIHRoZSBvbXBsZXRpb24gcmF0ZSwgcHJpbWFyeSBlZHVjYXRpb24sIGZvciBkaWZmZXJlbnQgSW5jb21lIGdyb3VwcyBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNn0NCmdncGxvdGx5KA0KICBnZ3Bsb3QoDQogICAgZWNvemNycGVkdWNfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSBgSW5jb21lIGdyb3VwYA0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSBlY296bWVkaWFuLA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gY3Jvc3NlY296bWVkKSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBzaXplID0gMQ0KICAgICkgKw0KICAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1pbmNvbWUgZ3JvdXAgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgZ2VvbV9zZWdtZW50KA0KICAgICAgYWVzKHggPSAyMDIxLCB4ZW5kID0gMjAyMSwgeSA9IDQ5LjY4LCB5ZW5kID0gMTAwKSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gNjUsDQogICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCBsb3cgaW5jb21lIGNvdW50cmllcydcbiB2YWx1ZSBpbiAyMDIxIGlzIDUwLjMiKSwNCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIg0KICAgICkgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDE1LCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkYXJrZ3JlZW4iLCJwdXJwbGUzIiAsICJkYXJrYmx1ZSIsICJvcmFuZ2UzIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiDQogICAgKQ0KKQ0KYGBgDQoNCiMjIyMjICoqU291cmNlIDogPGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvPioqDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBOZXQgZW5yb2xtZW50IHJhdGUsIGVhcmx5IGNoaWxkaG9vZCBlZHVjYXRpb24sIGJvdGggc2V4ZXMgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpuZXJlY2VkdWNfZGYgPC0gZGYgfD4NCiAgZmlsdGVyKA0KICAgIFllYXIgJWluJSBzZXEoMjAxNSwgMjAyMSksDQogICAgYEluZGljYXRvciBOYW1lYCA9PSAiTmV0IGVucm9sbWVudCByYXRlLCBlYXJseSBjaGlsZGhvb2QgZWR1Y2F0aW9uLCBib3RoIHNleGVzICglKSINCiAgKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3gobmVyZWNlZHVjX2RmLCAiZGF0YS90aWR5L25lcmVjZWR1Y19kZi54bHN4IikNCiMgZ2xpbXBzZShvc3JfZGYpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCnJlZ25lcmVjZWR1Y19kZiA8LSBuZXJlY2VkdWNfZGYgfD4NCiAgZ3JvdXBfYnkocmVnaW9uLCBZZWFyKSB8Pg0KICBzdW1tYXJpemUobWVkaWFuX3ZhbHVlID0gbWVkaWFuKFZhbHVlKSkgfD4NCiAgbXV0YXRlKHRhcmdldCA9IDEwMCkNCiAgIyBzZWxlY3QoWWVhciwgUmVnaW9uLCBWYWx1ZSkNCiN2aWV3KHJlZ19kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KHJlZ25lcmVjZWR1Y19kZiwgImRhdGEvdGlkeS9yZWduZXJlY2VkdWNfZGYueGxzeCIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlZ21lZGlhbiA8LSByZWduZXJlY2VkdWNfZGYgfD4NCiAgZ3JvdXBfYnkoWWVhcikgfD4NCiAgc3VtbWFyaXplKGNyb3NzcmVnbWVkID0gbWVkaWFuKG1lZGlhbl92YWx1ZSkpDQojIGVjb3ptZWRpYW4NCmBgYA0KDQojIyMjIyAqKkZpZ3VyZSA5OioqIE1lZGlhbiB2YWx1ZSB0cmVuZCBvZiB0aGUgTmV0IGVucm9sbWVudCByYXRlLCBlYXJseSBjaGlsZGhvb2QgZWR1Y2F0aW9uLCBmb3IgZGlmZmVyZW50IHJlZ2lvbiBmcm9tIDIwMTUgdG8gMjAyMi4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOS41LCBmaWcuaGVpZ2h0ID0gNn0NCmdncGxvdGx5KA0KICByZWduZXJlY2VkdWNfZGYgfD4NCiAgICAjIGZpbHRlcigNCiAgICAjICAgcmVnaW9uICVpbiUgYygNCiAgICAjICAgICAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiU3ViLVNhaGFyYW4gQWZyaWNhIg0KICAgICMgICApDQogICAgIyApIHw+DQogIGdncGxvdCgNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDENCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtcmVnaW9uYWwgbWVkaWFuIHZhbHVlIiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgYWVzKHggPSBZZWFyLCB5ID0gdGFyZ2V0KSwNCiAgICAgIGNvbG9yID0gImRhcmtncmVlbiIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgRWR1Y2F0aW9uIDIwMzAgRkZBIFRhcmdldCIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiINCiAgICApICsNCiAgICBnZW9tX3NlZ21lbnQoDQogICAgICBhZXMoeCA9IDIwMjEsIHhlbmQgPSAyMDIxLCB5ID0gNDQuMywgeWVuZCA9IDEwMCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgIGdlb21fdGV4dCgNCiAgICAgIGFlcyh4ID0gMjAxOCwgeSA9IDg1LA0KICAgICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgdGhlIGNyb3NzLXJlZ2lvbmFsJ3NcbiB2YWx1ZSBpbiAyMDIxIGlzIDQ0IiksDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJyZWQiDQogICAgKSArDQogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheSIpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgICAgdmFsdWVzID0gYygNCiAgICAgICAgImRhcmtibHVlIiwgIm9yYW5nZTMiLCAicHVycGxlMyIsICJicm93bjQiLCAiZGFya2dyZWVuIiwgInBpbmszIiwgImRvZGdlcmJsdWUiDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSIsDQogICAgICBjYXB0aW9uID0gIlNvdXJjZTogaHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8iDQogICAgKSANCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFLCBlY2hvPUZBTFNFfQ0KZWNvem5lcmVjZWR1Y19kZiA8LSBuZXJlY2VkdWNfZGYgfD4NCiAgZ3JvdXBfYnkoYEluY29tZSBncm91cGAsIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcoZWNvel9kZikNCm9wZW54bHN4Ojp3cml0ZS54bHN4KGVjb3puZXJlY2VkdWNfZGYsICJkYXRhL3RpZHkvZWNvem5lcmVjZWR1Y19kZi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296bmVyZWNlZHVjX2RmIHw+DQogIGdyb3VwX2J5KFllYXIpIHw+DQogIHN1bW1hcml6ZShjcm9zc2Vjb3ptZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDEwOioqIE1lZGlhbiB2YWx1ZSB0cmVuZCBvZiB0aGUgTmV0IGVucm9sbWVudCByYXRlLCBlYXJseSBjaGlsZGhvb2QgZWR1Y2F0aW9uLCBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDZ9DQpnZ3Bsb3RseSgNCiAgZ2dwbG90KA0KICAgIGVjb3puZXJlY2VkdWNfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSBgSW5jb21lIGdyb3VwYA0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMDUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IGVjb3ptZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc2Vjb3ptZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxLjINCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIGFlcyh4ID0gMjAyMSwgeGVuZCA9IDIwMjEsIHkgPSAzNS4wMzc1LCB5ZW5kID0gMTAwKSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gODUsDQogICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCB0aGUgY3Jvc3MtZWNvbm9taWMnc1xuIHZhbHVlIGluIDIwMjEgaXMgNjUiKSwNCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICApICsNCiAgICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5IikpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgICB2YWx1ZXMgPSBjKA0KICAgICAgICAicmVkNCIsInB1cnBsZTMiICwgImRhcmtibHVlIiwgIm9yYW5nZTMiDQogICAgICApDQogICAgKSArDQogICAgbGFicygNCiAgICAgICN0aXRsZSA9ICJTbW9vdGggTGluZSBQbG90IHdpdGggTGVnZW5kIGFuZCBNYXJrZXJzIiwNCiAgICAgIHggPSAiWWVhciIsDQogICAgICB5ID0gIk1lZGlhbiBWYWx1ZSINCiAgICApDQopDQpgYGANCg0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KIyMgQW5hbHlzaXMgb2YgdGhlIE5ldCBlbnJvbG1lbnQgcmF0ZSwgcHJlLXByaW1hcnksIGJvdGggc2V4ZXMgKCUpDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpuZXJwcHJpbV9kZiA8LSBkZiB8Pg0KICBmaWx0ZXIoDQogICAgWWVhciAlaW4lIHNlcSgyMDE1LCAyMDIxKSwNCiAgICBgSW5kaWNhdG9yIE5hbWVgID09ICJOZXQgZW5yb2xtZW50IHJhdGUsIHByZS1wcmltYXJ5LCBib3RoIHNleGVzICglKSINCiAgKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3gobmVycHByaW1fZGYsICJkYXRhL3RpZHkvbmVycHByaW1fZGYueGxzeCIpDQojIGdsaW1wc2Uob3NyX2RmKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUUsIGVjaG89RkFMU0V9DQpyZWduZXJwcHJpbV9kZiA8LSBuZXJwcHJpbV9kZiB8Pg0KICBncm91cF9ieShyZWdpb24sIFllYXIpIHw+DQogIHN1bW1hcml6ZShtZWRpYW5fdmFsdWUgPSBtZWRpYW4oVmFsdWUpKSB8Pg0KICBtdXRhdGUodGFyZ2V0ID0gMTAwKQ0KICAjIHNlbGVjdChZZWFyLCBSZWdpb24sIFZhbHVlKQ0KI3ZpZXcocmVnX2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3gocmVnbmVycHByaW1fZGYsICJkYXRhL3RpZHkvcmVnbmVycHByaW1fZGYueGxzeCIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlZ21lZGlhbiA8LSByZWduZXJwcHJpbV9kZiB8Pg0KICBncm91cF9ieShZZWFyKSB8Pg0KICBzdW1tYXJpemUoY3Jvc3NyZWdtZWQgPSBtZWRpYW4obWVkaWFuX3ZhbHVlKSkNCiMgZWNvem1lZGlhbg0KYGBgDQoNCiMjIyMjICoqRmlndXJlIDExOioqIE1lZGlhbiB2YWx1ZSB0cmVuZCBvZiB0aGUgTmV0IGVucm9sbWVudCByYXRlLCBwcmUtcHJpbWFyeSwgZm9yIGRpZmZlcmVudCByZWdpb24gZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDZ9DQpnZ3Bsb3RseSgNCiAgcmVnbmVycHByaW1fZGYgfD4NCiAgICAjIGZpbHRlcigNCiAgICAjICAgcmVnaW9uICVpbiUgYygNCiAgICAjICAgICAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiU3ViLVNhaGFyYW4gQWZyaWNhIg0KICAgICMgICApDQogICAgIyApIHw+DQogIGdncGxvdCgNCiAgICBhZXMoDQogICAgICB4ID0gWWVhciwNCiAgICAgIHkgPSBtZWRpYW5fdmFsdWUsDQogICAgICBjb2xvciA9IHJlZ2lvbg0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGRhdGEgPSByZWdtZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc3JlZ21lZCksDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLA0KICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgc2l6ZSA9IDEuMg0KICAgICkgKw0KICAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAwLCBsYWJlbCA9ICLilqAg4pagIOKWoCBDcm9zcy1yZWdpb25hbCBtZWRpYW4gdmFsdWUiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayINCiAgICApICsNCiAgICBnZW9tX2xpbmUoDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSB0YXJnZXQpLA0KICAgICAgY29sb3IgPSAiZGFya2dyZWVuIiwNCiAgICAgIHNpemUgPSAxLjIsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMTA1LCBsYWJlbCA9ICLilqAg4pagIOKWoCBFZHVjYXRpb24gMjAzMCBGRkEgVGFyZ2V0IiksIA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIg0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIGFlcyh4ID0gMjAyMSwgeGVuZCA9IDIwMjEsIHkgPSA1My44NCwgeWVuZCA9IDEwMCksDQogICAgICBjb2xvciA9ICJyZWQiLA0KICAgICAgc2l6ZSA9IDEsDQogICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiDQogICAgKSAgKw0KICAgICMgZ2VvbV90ZXh0KA0KICAgICMgICBhZXMoeCA9IDIwMTgsIHkgPSA4NSwNCiAgICAjICAgbGFiZWwgPSAiVGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRcbiBhbmQgdGhlIGNyb3NzLXJlZ2lvbmFsJ3NcbiB2YWx1ZSBpbiAyMDIxIGlzIDQ0IiksDQogICAgIyAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gInJlZCINCiAgICAjICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJkYXJrYmx1ZSIsICJvcmFuZ2UzIiwgInB1cnBsZTMiLCAiYnJvd240IiwgImRhcmtncmVlbiIsICJwaW5rMyIsICJkb2RnZXJibHVlIg0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICAjdGl0bGUgPSAiU21vb3RoIExpbmUgUGxvdCB3aXRoIExlZ2VuZCBhbmQgTWFya2VycyIsDQogICAgICB4ID0gIlllYXIiLA0KICAgICAgeSA9ICJNZWRpYW4gVmFsdWUiLA0KICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IGh0dHA6Ly9zZGc0LWRhdGEudWlzLnVuZXNjby5vcmcvIg0KICAgICkgDQopDQpgYGANCg0KIyMjIyMgKipTb3VyY2UgOiA8aHR0cDovL3NkZzQtZGF0YS51aXMudW5lc2NvLm9yZy8+KioNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRSwgZWNobz1GQUxTRX0NCmVjb3puZXJwcHJpbV9kZiA8LSBuZXJwcHJpbV9kZiB8Pg0KICBncm91cF9ieShgSW5jb21lIGdyb3VwYCwgWWVhcikgfD4NCiAgc3VtbWFyaXplKG1lZGlhbl92YWx1ZSA9IG1lZGlhbihWYWx1ZSkpIHw+DQogIG11dGF0ZSh0YXJnZXQgPSAxMDApDQogICMgc2VsZWN0KFllYXIsIFJlZ2lvbiwgVmFsdWUpDQojdmlldyhlY296X2RmKQ0Kb3Blbnhsc3g6OndyaXRlLnhsc3goZWNvem5lcnBwcmltX2RmLCAiZGF0YS90aWR5L2Vjb3puZXJwcHJpbV9kZi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZWNvem1lZGlhbiA8LSBlY296bmVycHByaW1fZGYgfD4NCiAgZ3JvdXBfYnkoWWVhcikgfD4NCiAgc3VtbWFyaXplKGNyb3NzZWNvem1lZCA9IG1lZGlhbihtZWRpYW5fdmFsdWUpKQ0KIyBlY296bWVkaWFuDQpgYGANCg0KIyMjIyMgKipGaWd1cmUgMTI6KiogTWVkaWFuIHZhbHVlIHRyZW5kIG9mIHRoZSBOZXQgZW5yb2xtZW50IHJhdGUsIHByZS1wcmltYXJ5LCBmb3IgZGlmZmVyZW50IEluY29tZSBncm91cHMgZnJvbSAyMDE1IHRvIDIwMjIuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmhlaWdodCA9IDZ9DQpnZ3Bsb3RseSgNCiAgZ2dwbG90KA0KICAgIGVjb3puZXJlY2VkdWNfZGYsDQogICAgYWVzKA0KICAgICAgeCA9IFllYXIsDQogICAgICB5ID0gbWVkaWFuX3ZhbHVlLA0KICAgICAgY29sb3IgPSBgSW5jb21lIGdyb3VwYA0KICAgICkNCiAgKSArDQogICAgZ2VvbV9saW5lKHNpemUgPSAuOCkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGFlcyh4ID0gWWVhciwgeSA9IHRhcmdldCksDQogICAgICBjb2xvciA9ICJkYXJrZ3JlZW4iLA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICsNCiAgICBnZW9tX3RleHQoDQogICAgICBhZXMoeCA9IDIwMTgsIHkgPSAxMDUsIGxhYmVsID0gIuKWoCDilqAg4pagIEVkdWNhdGlvbiAyMDMwIEZGQSBUYXJnZXQiKSwgDQogICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iDQogICAgKSArDQogICAgZ2VvbV9saW5lKA0KICAgICAgZGF0YSA9IGVjb3ptZWRpYW4sDQogICAgICBhZXMoeCA9IFllYXIsIHkgPSBjcm9zc2Vjb3ptZWQpLA0KICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwNCiAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgIHNpemUgPSAxLjINCiAgICApICsNCiAgICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gMCwgbGFiZWwgPSAi4pagIOKWoCDilqAgQ3Jvc3MtaW5jb21lIGdyb3VwIG1lZGlhbiB2YWx1ZSIpLCANCiAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIg0KICAgICkgKw0KICAgIGdlb21fc2VnbWVudCgNCiAgICAgIGFlcyh4ID0gMjAyMSwgeGVuZCA9IDIwMjEsIHkgPSA1Mi41MzUwLCB5ZW5kID0gMTAwKSwNCiAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICBzaXplID0gMSwNCiAgICAgIGxpbmV0eXBlID0gImRvdHRlZCINCiAgICApICArDQogICAgZ2VvbV90ZXh0KA0KICAgICAgYWVzKHggPSAyMDE4LCB5ID0gODUsDQogICAgICBsYWJlbCA9ICJUaGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldFxuIGFuZCB0aGUgY3Jvc3MtZWNvbm9taWMnc1xuIHZhbHVlIGluIDIwMjEgaXMgNDcuNSIpLA0KICAgICAgaGp1c3QgPSAwLjUsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAicmVkIg0KICAgICkgKw0KICAgIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkiKSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJyZWQ0IiwicHVycGxlMyIgLCAiZGFya2JsdWUiLCAib3JhbmdlMyINCiAgICAgICkNCiAgICApICsNCiAgICBsYWJzKA0KICAgICAgI3RpdGxlID0gIlNtb290aCBMaW5lIFBsb3Qgd2l0aCBMZWdlbmQgYW5kIE1hcmtlcnMiLA0KICAgICAgeCA9ICJZZWFyIiwNCiAgICAgIHkgPSAiTWVkaWFuIFZhbHVlIg0KICAgICkNCikNCmBgYA0KDQojIyMjIyAqKlNvdXJjZSA6IDxodHRwOi8vc2RnNC1kYXRhLnVpcy51bmVzY28ub3JnLz4qKg0K